#ifndef ABSTRACTTHREAD_H
#define ABSTRACTTHREAD_H

#include <QThread>
#include <atomic>

#include "safequeue.h"

using namespace std;

class AbstractThread : public QThread
{
    Q_OBJECT
public:
    AbstractThread(SafeQueue* queue, QObject *parent = nullptr);
    virtual ~AbstractThread();

    // 停止线程
    virtual void stopProcessing();
    // 暂停线程
    virtual void pauseProcessing();
    // 继续线程
    virtual void keepProcessing();
    // 重置处理计数
    virtual void resetProcessCount();
    // 设置线程的图片索引
    virtual void setIndex(const int index);
    // 设置是否是点击上一张/下一张按钮的布尔值
    virtual void setManual(bool isManual);
    // 获取是否是点击上一张/下一张按钮的布尔值
    virtual bool getManual();

signals:
    // 错误信号
    void errorOccurred(const QString& errorMessage);

protected:
    virtual void run() = 0;
    // 判断线程是否应该停止
    bool shouldStop();
    // 检查并等待暂停状态解除
    void checkAndWaitRemovePause();
    // 子类访问队列的接口
    SafeQueue* getQueue() const;
    // 子类调用的重置停止标志
    void resetstopFlag();

protected:
    QWaitCondition waitCondition_;      // 等待条件变量
    QMutex pauseMutex_;                 // 暂停锁
    static int totalCount_;             // 图片总数量
    int currentIndex_;                  // 当前处理索引
    atomic<bool> isFirst_ = true;       // 判断是否首次运行程序
    bool isManual_ = false;             // 判断是否是点击上一张/下一张按钮

private:
    SafeQueue* queue_;                  // 安全队列
    atomic<bool> stopRequested_;        // 线程停止标志
    atomic<bool> pauseRequested_;       // 线程暂停标志
};

#endif // ABSTRACTTHREAD_H
